import { NextRequest, NextResponse } from "next/server"; import { getSupabaseAdminClient } from "@/lib/supabase/admin"; import { getCurrentUser } from "@/lib/auth/current-user"; import { deleteGroupAndData } from "@/lib/groups/delete-group"; /** POST /api/groups/[id]/leave — Leave a group */ export async function POST(request: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params; const user = await getCurrentUser(request); if (!user) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const admin = getSupabaseAdminClient(); const { data: membership } = await admin .from("group_members") .select("role") .eq("group_id", id) .eq("user_id", user.id) .maybeSingle(); if (!membership) { return NextResponse.json({ error: "Not a member of this group" }, { status: 403 }); } const { count } = await admin .from("group_members") .select("*", { count: "exact", head: true }) .eq("group_id", id); const isLastMember = count === 1; // If admin with other members, must transfer first if (membership.role === "admin" && !isLastMember) { return NextResponse.json( { error: "Transfer admin role before leaving. Use /api/groups/[id]/transfer first." }, { status: 400 }, ); } if (isLastMember) { await deleteGroupAndData(id); return NextResponse.json({ success: true, groupDeleted: true }); } const { error } = await admin .from("group_members") .delete() .eq("group_id", id) .eq("user_id", user.id); if (error) { return NextResponse.json({ error: "Failed to leave group" }, { status: 500 }); } return NextResponse.json({ success: true, groupDeleted: false }); } catch { return NextResponse.json({ error: "Internal server error" }, { status: 500 }); } }